带限定词的名字
因为名字空间是作用域,所以普通的作用域规则也对名字空间成立。因此,如果一个名字先前已在本名字空间里或者其外围作用域里声明过,它就可以直接使用了,不必再进一步为它操心。也可以使用来自另一个名字空间的名字,但需要用该名字所属的名字空间作为限定词。例如,
double Parser::term(bool get) // 请注意Parser::限定词
{
double left = prim(get); // 不需要限定词
for(;;)
switch(Lexer::curr_tok) { // 注意Lexer::限定词
case Lexer::MUL: // 注意Lexer::限定词
left *= prim(true); // 不需要限定词
// ...
}
// ...
}
第一行的Parser::限定词是必需的,用以说明这个term()就是在Parser里所声明的那一个,而不是别的什么不相干的全局函数。由于term()是Parser的成员,因此就不需要再为prim()使用限定词了。但是,如果没写Lexer限定词,curr_tok将会被认为是没有声明的,因为名字空间Lexer的成员在名字空间Parser里都不处在作用域之中。
🔚